package com.example.shirotest.study;

public class Queen8 {

    //定义一个max表示共有多少个皇后
    int max = 8;
    //定义数组array,保存皇后放置位置的结果，比如arr = {0,4,7,5,2,6,1,3}
    int[] array = new int[max];
    //摆放方式的总数
    static int count = 0;
    //判断冲突的次数
    static int countJudge = 0;

    public static void main(String[] args) {
        Queen8 queen8 = new Queen8();
        queen8.position(0);
        System.out.printf("The result is : %d ,The judge count is : %d",count,countJudge);
    }

    //放置第n个皇后
    private void position(int n){
        if(n==max){ //n=8,说明8个皇后已经摆好
            count++;
            print();
            return;
        }

        //依次放入皇后，并判断是否冲突
        for (int i = 0; i < max; i++) {
            //第n个皇后，依次从0-(max-1)摆放
            array[n] = i;
            //判断摆放是否和前面的有冲突
            if(judge(n)){  //不冲突
                //接着放n+1个皇后
                position(n+1);
            }
            //冲突，则放到下一个位置
        }
    }
    
    //查看当我们放置第n个皇后，检测该皇后是否和前面已经摆放的皇后冲突
    /**
     * @param n 表示第n个皇后
     * @return
     */
    private boolean judge(int n){
        countJudge++;
        for (int i = 0; i < n; i++) {
            //1.array[i] == array[n] 表示判断第n个皇后和前面n-1个皇后是分在同一列
            //2.Math.abs(n-i) == Math.abs(array[n] - array[i]) 表示判断第n个皇后和前面n-1个皇后是否在同一斜线
            //3.判断是否在同一行，没有必要，n每次都在递增
            if(array[i] == array[n] || Math.abs(n-i) == Math.abs(array[n] - array[i])){
                return false;
            }
        }
        return true;
    }

    //输出皇后摆放的位置输出
    private void print(){
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
    }

}
